import os
import time
import xlrd3
from common.configManager import local_config
from config import DIR_PATH
from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment
from openpyxl.styles.colors import COLOR_INDEX

data_path = os.path.join(DIR_PATH, 'data')  #data目录的路径
class CaseExcelUtils:
    def __init__(self, module_name, case_name, data_path=data_path):
        """
        优化根据模块名读取excel内容
        :param module_name: 模块内容 在element_info下的模块，如：baidu
        :param page_name:  excel页面文件名称，如：baidu_page
        :param excel_path: 查找当前路径下
        """
        #获取指定Excel的路径
        self.excel_path = os.path.join(data_path, module_name, case_name + '.xlsx')
    '''
    cases用于存放Excel中的所有用例
    case用于存放每一条用例
    用例的判断：case关键字来区分每一个测试用例
    
    '''
    def get_case_data(self,n):  #获取指定sheet页中的数据
        self.n = n   #将sheet页保存为一个实例属性，确保读取数据和写入数据时使用的是同一个sheet
        '''
        读取数据使用xlrd3，xlrd3中行和列的索引是从0开始
        :param n: 表示从使用哪个第几个sheet页
        :return:
        '''
        # 创建excel对象
        self.work_book = xlrd3.open_workbook(self.excel_path)
        # 创建表单对象
        self.sheet = self.work_book.sheet_by_index(n-1)
        # 获取总行数
        self.row_count = self.sheet.nrows

        cases = []  #所有用例都存放在cases列表中

        #--------------记录第一条测试用例的数据------------
        case_name = self.sheet.cell_value(1, 0) #记录测试用例的名称(第一个用例：从第二行开始)
        case_row = 2 #记录测试用例名称所在行数

        hopes = [] #记录预期结果
        hope_by = self.sheet.cell_value(1, 3) #记录预期结果
        hope_locate = self.sheet.cell_value(1, 4)  # 记录预期结果
        hope_value = self.sheet.cell_value(1, 5)  # 记录预期结果
        hopes.append(hope_by)
        hopes.append(hope_locate)
        hopes.append(hope_value)

        flag = self.sheet.cell_value(1, 6) #记录是否执行第一条用例

        case_step = []  # 用于记录用例的每个步骤的数据（即excel每一行的数据）
        case_steps = [] # 用于记录每个测试用例的所有步骤（不包括用例名称，即每个测试用例包括了excel的多行数据）

        case = []  # 记录每个测试用例的名称、测试数据（即存放case_name和case_steps）

        for row in range(2, self.row_count):  # 行号和列号都是从0开始，所以2表示第三行
            # 取出每行然后进行拼接处理
            if self.sheet.cell_value(row, 0).startswith("case"):  #表示这个是测试用例标题行
                if flag.lower()=='y':
                    # case_name = self.sheet.cell_value(row, 0)
                    # flag = self.sheet.cell_value(row,4)
                    case.append(case_name) #往case中添加用例名称
                    case.append(case_row)  #将用例标题所在的行数添加进去
                    case.append(hopes)    #预期结果加入
                    case.append(case_steps) #往case中将和用例名对应的用例的数据放入容器
                    cases.append(case) #每个用例转为元组后存放在cases用例集中（parameterized.expand参数化必须按照元组来传）

                    # ------------ 开始记录下一个测试用例 -------------------
                    case = [] #将用例添加到cases中后，清空临时容器
                    case_steps = [] #清空临时容器

                    case_name = self.sheet.cell_value(row, 0)  #获取下一个用例的标题
                    case_row = row+1  #因为行号是从0开始，所以用例标题的行数要用row+1表示

                    hopes = [] # 清空上一个用例的预期结果，准备存放下一个用例的预期结果
                    hope_by = self.sheet.cell_value(row, 3)  # 记录预期结果
                    hope_locate = self.sheet.cell_value(row, 4)  # 记录预期结果
                    hope_value = self.sheet.cell_value(row, 5)  # 记录预期结果
                    hopes.append(hope_by)
                    hopes.append(hope_locate)
                    hopes.append(hope_value)

                    flag = self.sheet.cell_value(row, 6)  # 记录下一个用例的执行标记

                else:  #执行标记不是y，则表示不执行，因此该用例不需要加入到cases中
                    case = []  # 不需要添加到用例结合中，清空即可
                    case_steps = []  # 不需要将其加入到用例中（case）

                    # ------------ 开始记录下一个测试用例 -------------------
                    case_name = self.sheet.cell_value(row, 0) #下一个用例的名字
                    case_row = row + 1 #下一个用例的标题

                    hopes = []
                    hope_by = self.sheet.cell_value(row, 3)  # 记录预期结果
                    hope_locate = self.sheet.cell_value(row, 4)  # 记录预期结果
                    hope_value = self.sheet.cell_value(row, 5)  # 记录预期结果
                    hopes.append(hope_by)
                    hopes.append(hope_locate)
                    hopes.append(hope_value)
                    flag = self.sheet.cell_value(row, 6)
                continue

            ''' 
            将excel中每一步骤的数据，放在case_step中，excel中1-3列数据是测试步骤，所以取range(2)
            '''
            for m in range(3): #步骤中只记录第一列和第三列的数据
                if m !=1:  #第二列是步骤说明
                    if not self.sheet.cell_value(row, m) == '': # 如果该单元格的值不为空则添加到步骤中
                        case_step.append(self.sheet.cell_value(row, m))
            if case_step:
                case_steps.append(tuple(case_step)) #将每一个步骤，添加到整个用例步骤case_steps中
            case_step=[] #添加后清空

        #将最后一个用例添加到容器
        if flag.lower() == "y":
            case.append(case_name)
            case.append(case_row)
            case.append(hopes)
            # case.append(flag)
            case.append(case_steps)

        if case: #case不为空则添加
            cases.append(case)

        return cases

    def write_case_result(self, row_n, value):
        '''
        写入数据用的是openpyxl库，在这个库中，行号和列号是从1开始
        :param row_n: 用例所在行
        :param value: 用例的执行结果
        :return:
        '''
        # 打开文件
        self.wb = load_workbook(self.excel_path)
        self.ws = self.wb.worksheets[0]


        fontGREEN = Font(color=COLOR_INDEX[3], bold=True) #bold可以设置是否加粗
        fontRED = Font(color=COLOR_INDEX[2], bold=True)

        # 获数记录测试结果的单元格坐标
        H_n = "H" + str(row_n) #记录执行结果所在单元格

        if value.upper() == "PASS":
            # 如果该用例的测试结果为Pass，则测试结果所在单元格的的颜色设置为绿色
            self.ws.cell(row_n, 8, value)  # 8是固定的，因为excel中第8列是用于记录测试结果
            self.ws[H_n].font = fontGREEN

        if value.upper() == "FAIL":
            # 如果该用例的测试结果为Fail，则测试结果所在单元格的的颜色设置为红色
            self.ws.cell(row_n, 8, value)
            self.ws[H_n].font = fontRED

        self.wb.save(self.excel_path)  #保存测试结果
        time.sleep(1)

    def write_case_time(self, row_n, value):
        # 打开文件
        self.wb = load_workbook(self.excel_path)
        self.ws = self.wb.active

        #淡金色
        font1 = Font(color=COLOR_INDEX[19], bold=True)

        # 获数所在行数，记录
        I_n = "I" + str(row_n)  # 执行时间所在单元格

        # 写入时间，记录时间的列是第9列
        self.ws.cell(row_n, 9, value)  #openpyxl中行号和列号都是从1开始的

        self.ws[I_n].font = font1
        self.wb.save(self.excel_path)
        time.sleep(1)

if __name__ == '__main__':
    ex = CaseExcelUtils("addGoodClass", "goodClass")
    # print(ex.get_case_data(1))
    ex.write_case_result(2,'fail')

    # ex = CaseExcelUtils("baidu", "baidu_page")
    # ex.write_case_result(6,"fail")

'''
[
    [
        'case-输入正确的数据',  #用例的标题
        2,  #用例标题所在的行数
        ['', '', 'category_save'], #预期结果
        [ #测试步骤
            ('ht_login', 'admin,123456'), 
            ('go_to_good_class',), 
            ('input_all',), 
            ('click_确定',), 
            ('assert_by_url', 'url')
        ]
    ], 
    [
        'case-分类名称为空或空格时，提示是否正确', 
        8, 
        ['class name', 'invalid-msg', '分类名称不能为空'], 
        [
            ('ht_login', 'admin,123456'), 
            ('go_to_good_class',), 
            ('input_all',), 
            ('input_分类名称', '  '), 
            ('click_确定',), 
            ('assert_by_elem_text', 'text')
        ]
    ]
]
'''